import BaseDao from '../dao/BaseDao';
import BaseEntity from '../entity/BaseEntity';
import DataEntity from '../entity/DataEntity';
import DelFlag from '../entity/DelFlag';

/**
 * 业务处理的基础类
 */
export default abstract class BaseService<T extends BaseEntity> {
    constructor(protected _dao: BaseDao<T>) {
    }

    /**
     * 保存数据
     * @param data  要保存的数据
     */
    save(data: T): void {
        if (data instanceof DataEntity) {
            (<DataEntity>data).createData = new Date();
            (<DataEntity>data).updateData = new Date();
            (<DataEntity>data).delflag = DelFlag.NOMAL;
        }
        this.beforeSave(data);
        this._dao.save(data).then(() => {
            //TODO 记录日志
        }).catch((err => {
            throw err;
        }));
    }
    /**
     * 数据保存之前，进行数据默认值的填充
     */
    protected abstract beforeSave(data: T): void;
    /**
     * 更新数据
     * @param data  要保存的数据
     */
    update<K extends DataEntity>(data: K): void {
        if (data instanceof DataEntity) {
            (<DataEntity>data).updateData = new Date();
        }
        this.beforeUpdate(data);
        let fileds: string[] = this.getFileds();
        this._dao.update(data, fileds).then(() => {
            //TODO 记录日志
        }).catch((err => {
            throw err;
        }));
    }
    /**
     * 获取需要更新的字段
     */
    protected abstract getFileds(): string[];
    /**
     * 数据保存之前，进行数据默认值的填充
     */
    protected abstract beforeUpdate<K extends DataEntity>(data: K): void;
    /**
     * 删除数据
     * @param data  要保存的数据
     */
    deleteData(id: number): void {
        this._dao.deleteData(id).then(() => {
            //TODO 记录日志
        }).catch((err => {
            throw err;
        }));
    }
    /**
     * 删除数据
     * @param data  要保存的数据
     */
    async get<K extends DataEntity>(id: number): Promise<K | null> {
        return this._dao.get(id);
    }
}
